package com.linyaonan.leetcode.sword_to_offer._50;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。
 *
 * 示例 1:
 *
 * 输入：s = "abaccdeff"
 * 输出：'b'
 * 示例 2:
 *
 * 输入：s = ""
 * 输出：' '
 *  
 *
 * 限制：
 *
 * 0 <= s 的长度 <= 50000
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author: Lin
 * @date: 2022/7/26
 */
public class FirstUniqChar {

    /**
     * 由于需要找到第一次出现且只出现一次的字符，所以有序哈希表是最合适的
     * @param s
     * @return
     */
    public char firstUniqChar(String s) {
        if (s == null || "".equals(s)) {
            return ' ';
        }

        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
        for (char c : s.toCharArray()) {
            int r = c - 'a';
            map.put(r, map.getOrDefault(r, 0) + 1);
        }

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                return (char) (entry.getKey() + 'a');
            }
        }

        return ' ';

    }

}
